package com.shujia.spark.core

import org.apache.spark.{SparkConf, SparkContext}

object Demo20Accumulator {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("app")

    val sc = new SparkContext(conf)

    val rdd = sc.textFile("spark/data/students.txt")

    /* var count = 0
     rdd.foreach(line => {
       /**
         * 在算子内部对Driver端变量进行的任何修改的操作都不会生效， count只是一个变量副本
         * 算子内部的代码运行在Executor中，算子外的代码运行在Driver端
         *
         */
       count += 1
     })
     println(count)*/
    /**
      * 累加器  只是用来做累加的
      * 原理
      * 1、先在Executor中进行局部累加
      * 2、当job执行完成之后在Driver进行汇总
      *
      * 使用限制
      * 1、只能在Driver端定义
      * 2、只能在Executor端进行累加
      * 3、只能在Driver进行读取
      */
    //1、定义累加器,初始化默认值
    val count = sc.accumulator(0)

    rdd.foreach(i => {

      //2、对累加器进行累加
      count.add(1)
    })

    //3、在Driver端进行读取
    println(count.value)


  }

}
